/*
 * ISTY 1
 * Projet IDD
 * Jeu de société Caylus
 *
 * Groupe 9:
 *      Bedhiaf Mouna
 *      Joober Nizar
 *      Labassi Amine
 *      Sridi Med Mahdi
 * Année 2008/2009
 */

package caylus.Model;

import java.io.Serializable;

/**
 * Une étiquette est un batiment que tout joueur peut construire
 * L'intégration de cette classe répond à l'aspect dynamique du contenu des cases:
 * Chaque case pouvant contenir n'importe quelle étiquettes détenue par le Croupier
 *
 * @author Groupe 9 ISTY 1
 */
public class Etiquette implements Serializable{

	private Lot _prix;
    private int _numero;
    private Joueur _joueurProprietaire = null;
    private Joueur _joueurOccupant = null;
    boolean disponible = true;

    /**
     * Une étiquette est un batiment que tout joueur peut construire
     * Le Croupier cré autant d'instances de cette classe que de batiments
     *
     * @param pNumero : le numéro dans la liste des étiquettes détenue par le Croupier
     * @param pPrix : le cout pour un joueur souhaitant l'acquérir
     */
    public Etiquette(int pNumero, Lot pPrix){
        _numero = pNumero;
        _prix = pPrix;
    }

    /**
     *
     * @return le numero de l'étiquette, qui servira au croupier.
     */
    public int get_numero() {
        return _numero;
    }

    /**
     *
     * @param _numero
     */
    public void set_numero(int _numero) {
        this._numero = _numero;
    }

    /**
     * Chaque fois qu'un joueur pose un de ses ouvriers sur une case contenant une étiquette, cette méthode est appelée
     * pour pouvoir par la suite appliquer l'effet de ce batiment au bon joueur.
     * @param pJoueurOccupant
     */
    public void set_joueurOccupant(Joueur pJoueurOccupant) {
        _joueurOccupant = pJoueurOccupant;
    }

    /**
     * Chaque fois qu'un joueur achète (ou construit) un batiment, cette méthode est appelée.
     * @param pJoueurProprietaire
     */
    public void set_joueurProprietaire(Joueur pJoueurProprietaire) {
        _joueurProprietaire = pJoueurProprietaire;
    }

    /**
     *
     * @return le joueur occupant l'étiquette (la case)
     */
    public Joueur get_joueurOccupant() {
        return _joueurOccupant;
    }

    /**
     *
     * @return le joueur propriétaire de l'étiquette.
     */
    public Joueur get_joueurProprietaire() {
        return _joueurProprietaire;
    }


    /**
     * Suivant le numéro de l'étiquette et le choix du joueur, applique l'action sur le joueur occupant
     * la case contenant cette étiquette ainsi que le joueur propriétaire
     * @param pChoix : choix du joueur provenant de l'interface HM
     * @param pLot
     */
    public void action(int pChoix, Lot pLot){
        switch(_numero){
            // les etiquettes rouges : [1..6]
            case 1:{
                _joueurOccupant.set_aLePermisDeConstruireBatimentMarron(true);
                break;
            }
            case 2:{
                if(pChoix == 1){
                    _joueurOccupant.recevoir(new Lot(0, 0, 0, 0, 0, 1));
                    break;
                }
                if(pChoix == 2){
                     _joueurOccupant.recevoir(new Lot(0, 0, 1, 0, 0, 0));
                    break;
                }
            }
            case 3:{
                 _joueurOccupant.recevoir(new Lot(0, 0, 0, 0, 1, 0));
                    break;
            }
            case 4:{
                if(pChoix == 1){
                    break; // ici le joueur Occupant choisi de ne rien donner, yrawa7
                }
                else{
                    if(pChoix == 2){
                    _joueurOccupant.payer(new Lot(0, 1, 0, 0, 0, 0));
                    }
                     if(pChoix == 3){
                    _joueurOccupant.payer(new Lot(0, 0, 1, 0, 0, 0));
                    }
                     if(pChoix == 4){
                    _joueurOccupant.payer(new Lot(0, 0, 0, 1, 0, 0));
                    }
                     if(pChoix == 5){
                    _joueurOccupant.payer(new Lot(0, 0, 0, 0, 1, 0));
                    }
                     if(pChoix == 6){
                    _joueurOccupant.payer(new Lot(0, 0, 0, 0, 0, 1));
                    }
                    _joueurOccupant.recevoir(new Lot(4, 0, 0, 0, 0, 0)); // le joueur reçoit 4 deniers
                    break;
                }
           }
            case 5:{
                _joueurOccupant.recevoir(new Lot(0, 1, 0, 0, 0, 0));
                break;
            }
            case 6:{
                if(pChoix == 1){
                    _joueurOccupant.recevoir(new Lot(0, 1, 0, 0, 0, 0));
                    break;
                }
                if(pChoix == 2){
                    _joueurOccupant.recevoir(new Lot(0, 0, 0, 0, 0, 1));
                    break;
                }
            }
            // les etiquettes marrons : [7..14]
            case 7:{
                _joueurProprietaire.gagnerPointsPrestige(4);
                // joueur occupant
                if(pChoix == 1){
                    break; // le joueur occupant ne donne rien, et ne reçoit rien en retour
                }
                else{
                     if(pChoix == 2){
                    _joueurOccupant.payer(new Lot(0, 1, 0, 0, 0, 0));
                    }
                     if(pChoix == 3){
                    _joueurOccupant.payer(new Lot(0, 0, 1, 0, 0, 0));
                    }
                     if(pChoix == 4){
                    _joueurOccupant.payer(new Lot(0, 0, 0, 0, 1, 0));
                    }
                     if(pChoix == 5){
                    _joueurOccupant.payer(new Lot(0, 0, 0, 0, 0, 1));
                    }
                     _joueurOccupant.recevoir(new Lot(6, 0, 0, 0, 0, 0)); // le joueur reçoit 6 deniers
                    break;
                }
            }
            case 8:{
                _joueurProprietaire.gagnerPointsPrestige(2);
                if(pChoix == 1){
                    _joueurOccupant.recevoir(new Lot(0, 0, 0, 0, 0, 2));
                    break;
                }
                if(pChoix == 2){
                    _joueurOccupant.recevoir(new Lot(0, 0, 1, 0, 0, 0));
                    break;
                }
            }
            case 9:{
                _joueurProprietaire.gagnerPointsPrestige(4);
                _joueurOccupant.set_aLePermisDeConstruireBatimentVert(true);
                break;
            }
            case 10:{
                 _joueurProprietaire.gagnerPointsPrestige(2);
                if(pChoix == 1){
                    _joueurOccupant.recevoir(new Lot(0, 0, 2, 0, 0, 0));
                    break;
                }
                if(pChoix == 2){
                    _joueurOccupant.recevoir(new Lot(0, 0, 0, 0, 0, 1));
                    break;
                }
            }
            case 11:{
                _joueurProprietaire.gagnerPointsPrestige(2);
                _joueurOccupant.recevoir(new Lot(0, 2, 0, 0, 0, 0));
                break;
            }
            case 12:{
                _joueurProprietaire.gagnerPointsPrestige(4);
                if((pChoix == 1) ||(pChoix == 2) || (pChoix == 3) || (pChoix == 4)){ // le joueur paye 1 denier pour recevoir un lot ( / or)
                    _joueurOccupant.payer(new Lot(1, 0, 0, 0, 0, 0));
                }
                 if(pChoix == 1){
                    _joueurOccupant.recevoir(new Lot(0, 1, 0, 0, 0, 0));
                    break;
                }
                if(pChoix == 2){
                    _joueurOccupant.recevoir(new Lot(0, 0, 1, 0, 0, 0));
                    break;
                }
                if(pChoix == 3){
                    _joueurOccupant.recevoir(new Lot(0, 0, 0, 0, 1, 0));
                    break;
                }
                if(pChoix == 4){
                    _joueurOccupant.recevoir(new Lot(0, 0, 0, 0, 0, 1));
                    break;
                }

                if(   (pChoix == 5) ||(pChoix == 6)  || (pChoix == 7)  || (pChoix == 8) || (pChoix == 9)
                   || (pChoix == 10)||(pChoix == 11) || (pChoix == 12) || (pChoix == 13)|| (pChoix == 14)){ // le joueur paye 2 denier pour recevoir un lot
                    _joueurOccupant.payer(new Lot(2, 0, 0, 0, 0, 0));
                }
                if(pChoix == 5){
                    _joueurOccupant.recevoir(new Lot(0, 1, 1, 0, 0, 0));
                    break;
                }
                if(pChoix == 6){
                    _joueurOccupant.recevoir(new Lot(0, 1, 0, 0, 1, 0));
                    break;
                }
                if(pChoix == 7){
                    _joueurOccupant.recevoir(new Lot(0, 1, 0, 0, 0, 1));
                    break;
                }
                if(pChoix == 8){
                    _joueurOccupant.recevoir(new Lot(0, 0, 1, 0, 1, 0));
                    break;
                }
                if(pChoix == 9){
                    _joueurOccupant.recevoir(new Lot(0, 0, 1, 0, 0, 1));
                    break;
                }
                if(pChoix == 10){
                    _joueurOccupant.recevoir(new Lot(0, 0, 0, 0, 1, 1));
                    break;
                }
                if(pChoix == 11){
                    _joueurOccupant.recevoir(new Lot(0, 2, 0, 0, 0, 0));
                    break;
                }
                if(pChoix == 12){
                    _joueurOccupant.recevoir(new Lot(0, 0, 2, 0, 0, 0));
                    break;
                }
                if(pChoix == 13){
                    _joueurOccupant.recevoir(new Lot(0, 0, 0, 0, 2, 0));
                    break;
                }
                if(pChoix == 14){
                    _joueurOccupant.recevoir(new Lot(0, 0, 0, 0, 0, 2));
                    break;
                }
                if(pChoix == 15 ) {
                    break ;
                }
            }

            case 13:{
               _joueurProprietaire.gagnerPointsPrestige(2);
               _joueurOccupant.recevoir(new Lot(0, 0, 0, 0, 2, 0));
               break;
            }
            case 14:{
                _joueurProprietaire.gagnerPointsPrestige(4);
                _joueurOccupant.set_aLePermisDeConstruireBatimentGris(true);
                break;
            }

            // etiquettes grise : [15..23]
            case 15: case 16:{
                _joueurProprietaire.gagnerPointsPrestige(6); // le joueur proprietaire gagne les 6 pts de prestige à tous les coups
                if(_joueurOccupant.getNbResidences() > 1) // ce joueur a déja contruit un batiment vert (Résidence)
                    _joueurOccupant.set_aLePermisDeConstruireBatimentBleu(true);
                break;
            }
            case 17:{
                //to do
            }
            case 18:{
                //to do
            }
            case 19:{
                _joueurProprietaire.gagnerPointsPrestige(6);
                if(pChoix == 1){
                    _joueurOccupant.payer(new Lot(0, 0, 2, 0, 0, 0));
                    _joueurOccupant.gagnerPointsPrestige(3);
                    break;
                }
                if(pChoix == 2){
                    _joueurOccupant.payer(new Lot(0, 0, 3, 0, 0, 0));
                    _joueurOccupant.gagnerPointsPrestige(6);
                    break;
                }
            }
            case 20:{
                 _joueurProprietaire.gagnerPointsPrestige(3);
                if(pChoix == 1){
                    _joueurOccupant.payer(new Lot(2, 0, 0, 0, 0, 0));
                    _joueurOccupant.gagnerPointsPrestige(3);
                    break;
                }
                if(pChoix == 2){
                    _joueurOccupant.payer(new Lot(4, 0, 0, 0, 0, 0));
                    _joueurOccupant.gagnerPointsPrestige(5);
                    break;
                }
            }
            case 21:{
                _joueurOccupant.payer(pLot);
                if((pLot.getBois() + pLot.getNouriture() + pLot.getPierre() + pLot.getTissu()) == 4)
                    _joueurOccupant.recevoir(new Lot(0, 0, 0, 2, 0, 0));
                if((pLot.getBois() + pLot.getNouriture() + pLot.getPierre() + pLot.getTissu()) == 2)
                    _joueurOccupant.recevoir(new Lot(0, 0, 0, 1, 0, 0));
            }
            case 22:{
                //to do
            }
            case 23:{
                _joueurProprietaire.gagnerPointsPrestige(6);
                if(pChoix == 1){
                    _joueurOccupant.payer(new Lot(2, 0, 0, 0, 0, 0));
                    _joueurOccupant.recevoir(new Lot(0, 0, 0, 1, 0, 0));
                    break;
                }
                if(pChoix == 2){
                    _joueurOccupant.payer(new Lot(5, 0, 0, 0, 0, 0));
                    _joueurOccupant.recevoir(new Lot(0, 0, 0, 2, 0, 0));
                    break;
                }
            }
            // etiquettes vertes : [24..31]
            case 24: case 25: case 26: case 27: case 28: case 29: case 30: case 31:{
                _joueurProprietaire.gagnerPointsPrestige(2);
                _joueurOccupant.recevoirDeniers(1);
                break;
            }
            // etiquettes bleues : [32..40]
            case 32:{
                _joueurProprietaire.gagnerPointsPrestige(7);
                _joueurProprietaire.gagnerFaveurDeRoi(1);
                break;
            }
            case 33:{
                 _joueurProprietaire.gagnerPointsPrestige(14);
                _joueurProprietaire.gagnerFaveurDeRoi(1);
                break;
            }
            case 34:{
                 _joueurProprietaire.gagnerPointsPrestige(12);
                break;
            }
            case 35:{
                 _joueurProprietaire.gagnerPointsPrestige(10);
                 _joueurOccupant.recevoirDeniers(1);
                break;
            }
            case 36:{
                 _joueurProprietaire.gagnerPointsPrestige(14);
                _joueurProprietaire.gagnerFaveurDeRoi(1);
                break;
            }
            case 37:{
                 _joueurProprietaire.gagnerPointsPrestige(16);
                 _joueurOccupant.recevoirDeniers(2);
                break;
            }
             case 38:{
                 _joueurProprietaire.gagnerPointsPrestige(25);
                break;
            }
              case 39:{
                 _joueurProprietaire.gagnerPointsPrestige(10);
                break;
            }
               case 40:{
                 _joueurProprietaire.gagnerPointsPrestige(14);
                 _joueurProprietaire.gagnerFaveurDeRoi(2);
                break;
            }
            case 41:{
                if(pChoix == 1)
                     break;
                else{
                    if(pChoix == 2){
                        _joueurOccupant.payer(new Lot(2, 0, 0, 0, 0, 0));
                        _joueurOccupant.recevoir(new Lot(0, 1, 0, 0, 0, 0));
                        break;
                    }
                    if(pChoix == 3){
                        _joueurOccupant.payer(new Lot(2, 0, 0, 0, 0, 0));
                        _joueurOccupant.recevoir(new Lot(0, 0, 1, 0, 0, 0));
                        break;
                    }
                     if(pChoix == 4){
                        _joueurOccupant.payer(new Lot(2, 0, 0, 0, 0, 0));
                        _joueurOccupant.recevoir(new Lot(0, 0, 0, 0, 1, 0));
                        break;
                    }
                     if(pChoix == 5){
                        _joueurOccupant.payer(new Lot(2, 0, 0, 0, 0, 0));
                        _joueurOccupant.recevoir(new Lot(0, 0, 0, 0, 0, 1));
                        break;
                    }
                }
            }
            case 42:{
                // to do ( la case 14 sur le plateau : case fixe )
            }
        }
    }
}
